package com.cdp.zwy.zwy_manager_back_v1.controller;

import cn.hutool.core.io.FileUtil;
import com.cdp.zwy.zwy_manager_back_v1.common.Result;
import com.cdp.zwy.zwy_manager_back_v1.common.UploadResult;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.Set;
import java.util.UUID;

/**
 * @author zwy
 * @version 1.0
 * @description: FileController  处理文件相关的接口 (已改造为使用 MinIO)
 * @date 2025/4/16 10:45
 */
@CrossOrigin
@RestController
@RequestMapping("/files")
public class FileController {

    // 从配置文件中注入 MinIO 的配置信息
    @Value("${minio.endpoint}")
    private String endpoint;

    @Value("${minio.accessKey}")
    private String accessKey;

    @Value("${minio.secretKey}")
    private String secretKey;

    @Value("${minio.bucketName}")
    private String bucketName;

    // 允许上传的图片类型白名单
    private static final Set<String> ALLOWED_EXTENSIONS = Set.of("jpg", "jpeg", "png", "gif");

    @PostMapping("/upload")
    public Result upload(MultipartFile file) {
        try {
            // 1. 校验文件
            String originalFilename = file.getOriginalFilename();
            if (originalFilename == null || originalFilename.isEmpty()) {
                return Result.error("400", "文件名不能为空");
            }
            String extension = FileUtil.extName(originalFilename);
            if (!ALLOWED_EXTENSIONS.contains(extension.toLowerCase())) {
                return Result.error("400", "不允许的文件类型");
            }

            // 2. 创建 MinioClient 实例
            MinioClient minioClient = MinioClient.builder()
                    .endpoint(endpoint)
                    .credentials(accessKey, secretKey)
                    .build();

            // 3. 生成唯一的文件名
            String fileName = UUID.randomUUID().toString() + "_" + originalFilename;

            // 4. 上传文件到 MinIO
            minioClient.putObject(
                    PutObjectArgs.builder()
                            .bucket(bucketName) // 指定 bucket
                            .object(fileName)   // 指定文件名
                            .stream(file.getInputStream(), file.getSize(), -1) // 文件流
                            .contentType(file.getContentType()) // 文件类型
                            .build()
            );

            // 5. 返回文件的访问 URL
            String url = endpoint + "/" + bucketName + "/" + fileName;

            // 注意：这里不再需要像之前一样提供下载接口了，因为文件已经可以直接通过 MinIO 的 URL 访问。
            // 因此，可以删除或注释掉原来的 download 方法。

            return Result.success(new UploadResult(url, fileName));

        } catch (Exception e) {
            e.printStackTrace();
            return Result.error("500", "文件上传失败");
        }
    }

    /*
     * 原来的 download 方法可以删除了，因为文件将通过 MinIO 直接访问。
     * @GetMapping("/download/{fileName}")
     * public void download(...) { ... }
     */
}